/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package servidorRMI;

import interfaces.Jogadas;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import model.Jogador;
import model.ListaJogadores;
import strategy.ListaCampos;
import strategy.modelos.Campo;

/**
 *
 * @author Lucas - Classe que implementa a interface que o cliente ira chamar
 * para realizar as jogadas..
 */
public class JogadasImp extends UnicastRemoteObject implements Jogadas {

    private ListaJogadores listaJogadores;
    private ListaCampos listaCampos;

    public JogadasImp() throws RemoteException {
        listaJogadores = ListaJogadores.getInstancia();
        listaCampos = ListaCampos.getInstancia();
    }

    @Override
    public void jogarDados(int dadoUm, int dadoDois, String nomeJogador) throws RemoteException {
        Jogador j = listaJogadores.buscarJogador(nomeJogador);
        j.lancarDados(dadoUm, dadoDois);
    }

    @Override
    public void comprarCampo(String jogador, boolean simNao) throws RemoteException {
        Jogador j = listaJogadores.buscarJogador(jogador);

        if (simNao) {
            j.comprar();
        } else {
            if (j.isMinhaVez()) {
                j.jogando();
                j.setMinhaVez(false);
            } else {
                j.aguardando();
                listaJogadores.nextJogador();
            }
            AddObservadorImp.getInstancia().notificaProximo();
        }
    }

    @Override
    public void ofertaCompra(String jogador, int campo, double valorOferta) throws RemoteException {
        Jogador jOfertante = listaJogadores.buscarJogador(jogador);
        Jogador jogDono = acharDono(campo);

        if (jogDono != null) {
            AddObservadorImp.getInstancia().notificarTroca(
                    jogDono.getName(),
                    jOfertante.getName(),
                    "" + campo,
                    "" + valorOferta);
        } else {
            System.out.println("Terreno não possue dono");
        }
    }

    @Override
    public void aceitarOferta(String novoDono, int campo, double valorOferta) throws RemoteException {
        Jogador jogNovoDono = listaJogadores.buscarJogador(novoDono);
        Jogador jogAntigoDono = acharDono(campo);
        Campo c = listaCampos.buscaCampo(campo);

        if (jogNovoDono.getMoney() >= valorOferta) { //Novo dono tem dinheiro para suprir a oferta feita
            //mecher no dinheiro...
            jogAntigoDono.setMoney(jogAntigoDono.getMoney() + valorOferta);
            jogNovoDono.setMoney(jogNovoDono.getMoney() - valorOferta);

            jogAntigoDono.removerCampo(c);
            jogNovoDono.adicionarCampo(c);

            AddObservadorImp.getInstancia().notificarMensagem(
                    jogNovoDono.getName(),
                    "TROCA: Você é o novo dono de "
                    + c.getDescricao()
                    + "!");

            AddObservadorImp.getInstancia().notificarMensagem(
                    jogAntigoDono.getName(),
                    "TROCA: Você vendeu o campo "
                    + c.getDescricao()
                    + "!");
        } else {//Notificar que o jogador não tem o dinheiro para a oferta...
            AddObservadorImp.getInstancia().notificarMensagem(jogNovoDono.getName(),
                    "Voce não tem dinheiro para tal oferta!");
        }
    }

    public Jogador acharDono(int campo) {
        for (Jogador jog : listaJogadores.getListaJogadores()) {
            for (Campo c : jog.getListaCampos()) {
                if (c.getIdCampo() == campo) {
                    return jog;
                }
            }
        }
        return null;
    }

    @Override
    public void recusarOferta(String jogador, String recusei) throws RemoteException {
        AddObservadorImp.getInstancia().notificarMensagem(jogador, recusei);
    }

    /*
     * fazer a verificação se o jogador pode colocar uma casa no terreno determinado e
     * ainda aumentar a taxa do campo que foi adicionado...
     * Casa = 80;
     * Hotel = 200;
     */
    @Override
    public void colocarCasa(String jogador, int campo) throws RemoteException {
        Jogador j = listaJogadores.buscarJogador(jogador);
        Campo c = listaCampos.buscaCampo(campo);

        //Valida se o jogador possui todos os terrenos de mesma cor...
        if (validarDonoTerrenos(j, c)) {
            if (validarCasas(c)) {
                if (c.getCasas() == 4) {
                    if (j.getMoney() >= 200) {
                        j.setMoney(j.getMoney() - 200);
                        c.setCasas(c.getCasas() + 1);
                        AddObservadorImp.getInstancia().notificarMensagem(j.getName(),
                                "Você adicionou uma casa ao terreno "
                                + c.getDescricao()
                                + "!");
                    } else {
                        AddObservadorImp.getInstancia().notificarMensagem(j.getName(),
                                "Você não tem dinheiro para comprar casas!");
                    }
                } else {
                    if (j.getMoney() >= 80) {
                        j.setMoney(j.getMoney() - 80);
                        c.setCasas(c.getCasas() + 1);
                        AddObservadorImp.getInstancia().notificarMensagem(j.getName(),
                                "Você adicionou uma casa ao terreno "
                                + c.getDescricao()
                                + "!");
                    } else {
                        AddObservadorImp.getInstancia().notificarMensagem(j.getName(),
                                "Você não tem dinheiro para comprar casas!");
                    }
                }
            } else {
                AddObservadorImp.getInstancia().notificarMensagem(j.getName(),
                        "Você nao pode colocar mais casas!");
            }
        } else {
            AddObservadorImp.getInstancia().notificarMensagem(j.getName(),
                    "Você não possui todos os terrenos!");
        }
    }

    /*
     * Verifica se o jogador possui todos os terranos da mesma cor....
     * caracterizando um bairro.
     */
    public boolean validarDonoTerrenos(Jogador jogador, Campo campo) {
        int contadorCampos = 0;
        int contadorCamposJogador = 0;

        for (Campo c : listaCampos.getListaCampos()) {
            if (c.getCor().equals(campo.getCor())) {
                contadorCampos = contadorCampos + 1;
            }
        }

        for (Campo campoJog : jogador.getListaCampos()) {
            if (campoJog.getCor().equals(campo.getCor())) {
                contadorCamposJogador = contadorCamposJogador + 1;
            }
        }

        if (contadorCampos == contadorCamposJogador) {
            return true;
        } else {
            return false;
        }
    }

    public boolean validarCasas(Campo campo) {
        for (Campo c : listaCampos.getListaCampos()) {
            if (c.getCor().equals(campo.getCor())) {
                if (campo.getCasas() != c.getCasas() & (campo.getCasas() + 1) != c.getCasas()) {
                    return false;
                }
            }
        }
        return true;
    }
}
